﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace K_Vizinhos
{
    public partial class Ajuda : Form
    {

        private List<ItemAjuda> liAjuda = new List<ItemAjuda>();
        public Ajuda()
        {
            InitializeComponent();
            CriarItensAjuda();
            SetarComponentes();
            treeView1.AfterSelect += new TreeViewEventHandler(treeView1_AfterSelect);
        }

        void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            txtDescricao.Text = e.Node.Name;
        }

        private void CriarItensAjuda()
        {
            liAjuda.Add(new ItemAjuda(liAjuda.Count, liAjuda.Count, "Classes", "Um conjunto de dados do mesmo tipo é chamado de classe"));
            liAjuda.Add(new ItemAjuda(liAjuda.Count, liAjuda.Count - 1, "Adicionar Classes", "Para adicionar uma nova classe, no menu Editar, clique em \"Adicionar Classe\". " + 
                                                                         "Na janela que surgir, informe o nome da classe, e a cor que deseje representar os dados. " +
                                                                         "Atenção: o nome das classes devem ser distintos! " +
                                                                         "A cor selecionada poderá ser alterada posteriormente, mas o nome da classe não poderá ser alterado."));
            liAjuda.Add(new ItemAjuda(liAjuda.Count, liAjuda.Count - 1, "Alterar cor de uma classe", "Para alterar a cor dos dados de uma classe, janela principal, ao lado do nome da classe, clique no botão que tem a coloração selecionada. " +
                                                                        "Em seguida aparecerá uma janela para selecionar a cor. " +
                                                                        "Todos os dados já informados desta classe terão sua cor alterada. "));
            liAjuda.Add(new ItemAjuda(liAjuda.Count, liAjuda.Count, "Dados", "Os dados são representados por pontos na tela, e estes podem ser adicionados de três formas: clique, arquivo ou aleatóriamente."));
            liAjuda.Add(new ItemAjuda(liAjuda.Count, liAjuda.Count - 1, "Adicionar Dados - Clique", "Pode-se adionar dados apenas clicando no gráfico. "+
                                                                         "Para isso, primeiramente é necessário selecionar a qual classe deseja associar o dado inserido. " +
                                                                         "Para associar o dado à classe, basta selecionar na barra lateral esquerda a classe. "));
            liAjuda.Add(new ItemAjuda(liAjuda.Count, liAjuda.Count - 2, "Adicionar Dados - Arquivo", "Para adicionar dados via arquivo, vá ao menu \"Arquivo\", e em seguida clique em \"Abrir\". " +
                                                                        "Uma janela irá surgir para selecionar o arquivo desejado. " +
                                                                        "Os dados do arquivo deverão estar no seguinte formato: \r\n\r\n"+
                                                                        "X, Y, Classe\r\n\r\n"+
                                                                        "em que: \r\n" +"X corresponde a coordenada X\r\n"+
                                                                        "Y corresponde a coordenada Y\r\n"+
                                                                        "Classe corresponde ao nome da classe. O nome da classe não poderá ter vírgulas. Caso haja, será considerado apenas o texto antes da vírgula."));
            liAjuda.Add(new ItemAjuda(liAjuda.Count, liAjuda.Count - 3, "Adicionar Dados - Aleatórios", "Para adicionar dados aleatórios, primeiramente é necessário que haja pelo menos uma classe criada. "+
                                                                        "Assim que houver pelo menos uma classe, no menu \"Editar\", clique em \"Adicionar Dados Aleatórios\". " +
                                                                        "Em seguida, uma janela aparecerá para configurar os dados a serem adicionados. " +
                                                                        "Primeiramente, selecione a quantidade de dados a serem adicionados no gráfico. " + 
                                                                        "Em seguida, selecione entre \"Igual\" ou \"Aleatório\" em que \"Igual\" indica que o número de dados de cada classe será igual, e \"Aleatório\" indica que a quantidade de dados de cada classe irá variar. " +
                                                                        "\r\n\r\nAtenção: Quando é selecionada a opção \"Igual\" e o número de classes já adicionadas não é divisivel pela quantidade de dados informado, a quantidade de dados inseridos será inferior do que selecionado.\r\n"+
                                                                        "Por exemplo: Há 3 classes, e foi definido inserir 7 dados. Neste caso, serão gerados 6 dados, 2 dados para cada classe."));
            liAjuda.Add(new ItemAjuda(liAjuda.Count, liAjuda.Count - 3, "Dados Informados", "Todos os dados informados, seja por clique, arquivo ou de forma aleatória estarão exibidos na barra lateral direita. "));
            liAjuda.Add(new ItemAjuda(liAjuda.Count, liAjuda.Count, "K-Vizinhos", "O algoritmo utiliza a distância euclidiana para definir à qual classe deve pertencer o dado informado. " + 
                                                                        "Para que o algoritmo defina à qual classe um dado pertence, deve se selecionar a opção \"K-Vizinhos\" na barra lateral esquerda. " +
                                                                        "Em seguida, ao passar a seta do mouse pelo gráfico, no local em que o mouse estiver, o retângulo ao lado do \"K-Vizinhos\" irá ter a cor alterada. " + 
                                                                        "A cor do retângulo é referente a classe que o ponto que o mouse estará caso este seja adicionado. " +
                                                                        "Para adicionar o dado, basta clicar no gráfico. "));
            liAjuda.Add(new ItemAjuda(liAjuda.Count, liAjuda.Count, "Arquivo", "Todas as alterações feitas poderão ser armazenadas em arquivo, assim como podem ser carregadas posteriormente. "));
            liAjuda.Add(new ItemAjuda(liAjuda.Count, liAjuda.Count - 1, "Abrir", "Para recuperar um arquivo, basta clicar no menu \"Arquivo\" e em seguida \"Abrir\". O formato do arquivo deverá ser seguido conforme descrito no item Dados\\Adicionar Dados - Arquivo nesta janela de Ajuda"));
            liAjuda.Add(new ItemAjuda(liAjuda.Count, liAjuda.Count - 2, "Salvar", "A qualquer momento, as alterações feitas no arquivo podem ser armazenadas em arquivo, pelo menu \"Arquivo\" e em seguida \"Salvar\". Além disso, quando desejar abrir um arquivo, criar um novo, ou sair do sistema, uma janela irá perguntar se deseja salvar alterações no arquivo. "+
                                                                         "As informações que serão arqmazenadas são apenas referentes aos pontos e classes. A cor de cada classe não será armazenada. Quando o usuário carregar esse arquivo salvo, as cores das classes serão definidas pelo sistema. "+
                                                                         "As cores definidas pelo sistema podem ser alteradas para melhorar a visualização dos dados."));
            
        }

        private void SetarComponentes()
        {

            foreach (ItemAjuda ia in liAjuda)
            {
                if (ia.Id == ia.Root)
                {
                    TreeNode tn = new TreeNode(ia.Titulo);
                    AddTreeNode(ref tn, ia.Id);
                    treeView1.Nodes.Add(tn);
                    tn.Name = ia.Descricao;
                }
            }
        }

        private void AddTreeNode(ref TreeNode node, int root)
        {
            ItemAjuda [] lajuda = (from m in liAjuda where m.Root == root && m.Root != m.Id select m).ToArray();
            foreach (ItemAjuda ia in lajuda)
            {
                TreeNode tn = new TreeNode(ia.Titulo);
                AddTreeNode(ref tn, ia.Id);
                node.Nodes.Add(tn);
                tn.Name = ia.Descricao;
            }
        }
    }
}
